package com.app.oral.dao

import com.app.oral.model.ExerciseRecord
import com.app.oral.model.ExerciseMode
import org.apache.ibatis.annotations.Mapper
import org.apache.ibatis.annotations.Param

/**
 * 练习记录数据访问接口
 */
@Mapper
interface ExerciseRecordMapper {
    
    /**
     * 插入练习记录
     */
    fun insert(record: ExerciseRecord): Int
    
    /**
     * 根据ID查询练习记录
     */
    fun selectById(id: String): ExerciseRecord?
    
    /**
     * 根据用户ID、试卷ID和模式查询练习记录
     */
    fun selectByUserPaperMode(
        @Param("userId") userId: Long,
        @Param("paperId") paperId: Long,
        @Param("mode") mode: ExerciseMode
    ): ExerciseRecord?
    
    /**
     * 根据用户ID查询所有练习记录
     */
    fun selectByUserId(userId: Long): List<ExerciseRecord>
    
    /**
     * 根据多个用户ID查询练习记录
     */
    fun selectByUserIds(@Param("userIds") userIds: List<Long>): List<ExerciseRecord>
    
    /**
     * 根据试卷ID查询所有练习记录
     */
    fun selectByPaperId(paperId: Long): List<ExerciseRecord>
    
    /**
     * 根据模式查询练习记录
     */
    fun selectByMode(mode: ExerciseMode): List<ExerciseRecord>
    
    /**
     * 查询已完成的练习记录
     */
    fun selectCompleted(): List<ExerciseRecord>
    
    /**
     * 更新练习记录
     */
    fun updateById(record: ExerciseRecord): Int
    
    /**
     * 根据ID删除练习记录
     */
    fun deleteById(id: String): Int
    
    /**
     * 统计用户练习记录数量
     */
    fun countByUserId(userId: Long): Int
    
    /**
     * 统计试卷练习记录数量
     */
    fun countByPaperId(paperId: Long): Int
    
    /**
     * 检查用户是否已有该试卷该模式的记录
     */
    fun existsByUserPaperMode(
        @Param("userId") userId: Long,
        @Param("paperId") paperId: Long,
        @Param("mode") mode: ExerciseMode
    ): Boolean
}